//
// Created by LiuYou on 2021/10/29.
//

#include <iostream>
#include <unistd.h>
#include <cstring>


static const int LEFT = 30000000;
static const int RIGHT = 30000200;
static const int THREAD_NUM = RIGHT - LEFT + 1;

static pthread_t tidArray[THREAD_NUM];
static int i;
static int threadArgs[THREAD_NUM];


static void* startRoutine(void* args) {
    int* pInt = static_cast<int*>(args);
    int num = *pInt;

    int mark{1};
    for (int j = 2; j < num / 2; ++j) {
        if (num % j == 0) {
            mark = 0;
            break;
        }
    }
    if (mark == 1) {
        printf( "%d 是一个质数。\n", num );
    }


    pthread_exit( nullptr );
}


/**
 * @brief 使用线程重构。
 * @details 如果一个数只能由 1 和 它本身 能够被它 整除的话, 那么这个数就是质数。
 *
 * <p>运行这个程序能观察到CPU的一个核的利用率会一下子飙升占满整个核。
 *
 *
 * <p> 每有一个待计算的 i 值, 就用一个线程来计算。
 * 所以, 应该把 内部 for循环 设计为一个独立的函数。
 *
 * @param argc
 * @param argv
 * @return
 */
int main(int argc, char** argv) {


    for (i = LEFT; i <= RIGHT; ++i) {
        threadArgs[i - LEFT] = i;
        // 根据调试发现是 pthread_create(); 第一个参数的问题,
        // 之前是传入的参数为 tidArray + i
        int errorNumber = pthread_create( tidArray + (i - LEFT), nullptr, startRoutine,
                                          (void*) (threadArgs + (i - LEFT)));
//        int errorNumber = pthread_create( tidArray + i, nullptr, [](void* args) -> void* {
//
//            pthread_exit( nullptr );
//        }, nullptr );

        // 一般情况下是不会出错的。
        if (errorNumber != 0) {
            fprintf( stderr, "pthread_create(): %s.\n", strerror(errno));
            return 1;
        }
        atexit( [] {
            pthread_join( tidArray[i - LEFT], nullptr );
        } );

    }


//    for (int i = 0; i < THREAD_NUM; ++i) {
//        pthread_join( tidArray[i], nullptr );
//    }


    return 0;
}
